Q4 双子素数を出力していってください。双子素数とは、差が2となる素数のペアのことです。
Q4 双子素数を出力していってください。双子素数とは、差が2となる素数のペアのことです。
僕の解答は以下
$ x=($(for i in {1..1000}; do factor $i; done | awk 'NF<=2{print $2}')); for (( i=0; i<${#x@}; i++ )); do diff=$(( ${x$i+1} - ${x$i} )); $diff -eq 2 && echo ${x$i} ${x$i+1}; done; factorに数値を渡すと素因数分解してくれる
素因数分解の結果が1つのときは、素数である
ということで、awkで素数の業のみ抽出して、配列変数に格納 Bashのforでループカウンタを使って素数配列にアクセスして、カウンタの1つ次の要素と引き算をして、差が2のときのみ出力する 割と素直な解き方だと思う
とはいえ、やや冗長な感じは否めない
上田先生の解答は以下
$ seq inf | factor | awk 'NF==2&&$0=$2' | awk 'NR!=1{print a,$1}{a=$1}' | awk '$2-$1==2'
この上田先生の解答、とても美しいなぁと思った
seq infで無限に数値を生成
そういえばそんな書き方あったなぁ
factorで素因数分解
パイプで渡せたのか
NFが2の時に抽出
NFはフィールドの数、なので先程の僕の考えと同じ
$0を上書きして出力を変更できるのか・・・
ループ1回目以外で、前の出力と一緒に値を出力
一時変数aに値を格納しておくことで、1つ前の値を一緒に出力する、というアプローチ面白い
こんな書き方あったのか
awkで差が2のもののみ抽出
awk多彩すぎ問題